;#############################
;命令：
;nasm -f elf64 day2_0function_1call_function_with_multiple_parameters_0base.asm -o main.o && gcc main.o -o main -lc -no-pie && ./main
;输出：
;传入参数为：1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
;#############################
extern printf

section .data
	msg: db `传入参数为：%d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n`, 0

section .text
	global main

main:
	push rbp
	mov rbp, rsp

;###############################################
	;The stack pointer rsp must be aligned to
	;a 16-byte boundary before making a call.
	;在调用函数之前，堆栈指针rsp必须与16字节的倍数对齐。
	;首先push会改变rsp的值
	;每push一次，rsp减少8
	;push了12 - 6 + 1 = 7次
	;rsp减少了7 * 8 = 56
	;由于rsp此时不是16的倍数
	;因而，在所有push之前补一个
	;sub rsp, 8
	;rsp减少了7 * 8 + 8 = 64
	;满足了要求
	sub rsp, 8
	push 12
	push 11
	push 10
	push 9
	push 8
	push 7
	push 6
	mov r9, 5
	mov r8, 4
	mov rcx, 3
	mov rdx, 2
	mov rsi, 1
	mov rdi, msg
	call printf

	;7个push，7 * 8 = 56
	;栈的大小需满足16字节的倍数
	;add rsp, 64
	;64是16的倍数
	;但是我们只使用了56个字节
	;为了对齐
	;所以先让栈开辟出8个字节
	;sub rsp, 8
	;两者相加正好64个字节
	add rsp, 64
;###############################################

	mov eax, 0
	leave
	ret
	;increasing the stack by using sub rsp
	;rsp points to address 100.
	;As said - whole memory above address 100 is used, and memory below 100 is free.
